﻿#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<locale.h>
#include<windows.h>
#include<stdbool.h>
#include<wchar.h>

#define WALL L'□'
#define BODY L'●'
#define FOOD L'▲'

//蛇默认起始坐标
#define POS_X 24
#define POS_Y 5

#define KEY_PRESS(VK) ( (GetAsyncKeyState(VK) & 0x1)? 1 : 0 )

enum GAME_STATUS {
	OK = 1,
	ESC,
	KILL_BY_WALL,
	KILL_BY_SELF
};

//蛇行走的方向
enum DIRECTION {
	UP=1,
	DOWN,
	LEFT,
	RIGHT
};
//蛇身结点的定义
typedef struct SnakeNode {
	int x;
	int y;
	struct SnakeNode* next;
}SnakeNode,*pSnakeNode;  // * pSnakeNode -> typedef struct SnakeNode* pSnakeNode;

//贪吃蛇
typedef struct Snake {
	pSnakeNode pSnake;//维护这条蛇的指针,指向蛇头
	pSnakeNode pFood;//指向食物的指针
	int Score; //累计的分数
	int FoodWeight;//一个食物的分数
	int SleepTime;//休眠的时间越短，蛇的速度越快；休眠的时间越长，蛇的速度越慢
	enum GAME_STATUS status;//游戏当前的状态
	enum DIRECTION direct;//蛇当前走的方向
}Snake,*pSnake;


//定位坐标信息
void SetPos(int x, int y);
//游戏初始化
void GameStart(pSnake ps);
//打印欢迎信息
void WelcomeToGame();
//绘制地图
void CreateMap();
//初始化蛇
void InitSnake(pSnake ps);
//创建食物
void CreateFood(pSnake ps);


//游戏运行
void GameRun(pSnake ps);
//打印帮助信息
void PrintHelpInfo();
//游戏暂停
void pause();
//蛇的移动(走一步)
void SnakeMove(pSnake ps);
//判断蛇头的下一步要走的结点坐标处是否为食物
int NextIsFood(pSnake ps, pSnakeNode pNext);
//是食物就吃掉
void EatFood(pSnake ps, pSnakeNode pNext);
//不是食物
void NotEatFood(pSnake ps, pSnakeNode pNext);
//检测是否撞墙
void KillByWall(pSnake ps);
//检测是否撞向自己
void KillBySelf(pSnake ps);

//游戏结束的释放工作
void GameEnd(pSnake ps);